package com.opensource.bykc.excel_lianxi.utils;

//import com.hcow.service.framework.fastdfs.FastDFSManager;
//import com.hcow.service.framework.lang.enums.TipsCode;
//import com.hcow.service.framework.lang.exception.ServiceException;
//import com.hcow.service.framework.lang.util.IdGeneratorUtil;
//import com.hcow.service.framework.lang.util.StringUtil;
//import com.hcow.service.framework.log.LOG;
import com.spire.xls.FileFormat;
        import lombok.Getter;
import lombok.Setter;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
//import org.csource.fastdfs.StorageClient;

        import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
        import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * excel报表
 */
@Getter
@Setter
public class ExcelReportUtil {

    //excel模板全路径
    private String path;

    //数据
    private Map data;

    //dfs文件管理器
    //private FastDFSManager fastDFSManager;

    private HttpServletRequest request;

    private HttpServletResponse response;

    private String spireFontPath;

    public ExcelReportUtil(String path, String spireFontPath, Map<String, Object> map,HttpServletRequest request, HttpServletResponse response ) {
        this.path = path;
        this.data = map;
        this.request = request;
        this.response = response;
        this.spireFontPath = spireFontPath;
    }
    //
    //
    //public ExcelReportUtil(String path, String spireFontPath, Map<String, Object> map,FastDFSManager fastDFSManager,HttpServletRequest request, HttpServletResponse response ) {
    //    this.path = path;
    //    this.data = map;
    //    //this.fastDFSManager = fastDFSManager;
    //    this.request = request;
    //    this.response = response;
    //    this.spireFontPath = spireFontPath;
    //}

    public ExcelReportUtil(Map<String, Object> map,HttpServletRequest request, HttpServletResponse response ) {
        this.data = map;
        this.request = request;
        this.response = response;
    }

    public ExcelReportUtil(String path) {
        this.path = path;
    }




    //填充数据
    public void filldataAndExport() {
        try {
            //读取xlsx格式文件
            Workbook wb=new XSSFWorkbook(new FileInputStream(path));
            Sheet sheet = wb.getSheetAt(0);
            for(int i = 0; i <= sheet.getLastRowNum(); i++){
                Row row = sheet.getRow(i);
                if(row !=null) {
                    for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
                        Cell cell = row.getCell(j);
                        String cellValue = cell.getStringCellValue();
                        String key = getKey(cellValue);
                        if (key != null) {
                            if (data.containsKey(key)) {
                                if (data.get(key) != null) {
                                    cell.setCellValue(data.get(key).toString());
                                } else {
                                    cell.setCellValue("");
                                }
                            } else {
                                cell.setCellValue("");
                            }
                        }
                    }
                }
            }
            //导出excel
            if (wb != null) {
                try {
                    String userAgent = request.getHeader("user-agent");
                    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 定义文件名格式
                    // excel 表文件名
                    String fileName = path  + "_" + format.format(new Date()) + ".xlsx";
                    String fileName11 = "";
                    if (userAgent != null && userAgent.indexOf("Firefox") >= 0 || userAgent.indexOf("Chrome") >= 0
                            || userAgent.indexOf("Safari") >= 0) {
                        fileName11 = new String((fileName).getBytes(), "ISO-8859-1");
                    } else {
                        fileName11 = URLEncoder.encode(fileName, "UTF8"); // 其他浏览器,防止IE乱码
                    }
                    String headStr = "attachment; filename=\"" + fileName11 + "\"";
                    response.setContentType("APPLICATION/OCTET-STREAM");
                    response.setHeader("Content-Disposition", headStr);
                    OutputStream out = response.getOutputStream();
                    wb.write(out);
                    out.flush();
                    out.close();
                } catch (IOException e) {
                    LOG.error(e);
                }
            }
        } catch (IOException e) {
            LOG.error(e);
        }
    }


    //填充数据
//            public void filldataAndExport2() {
//                InputStream is = null;
//                try {
//                    //读取xlsx格式文件
//                    com.spire.xls.Workbook wb=new com.spire.xls.Workbook();
//                    is = new FileInputStream(path);
//                    wb.loadFromStream(is);
//                    Worksheet worksheet =  wb.getWorksheets().get(0);
////            //遍历填充数据中的key值
////            Iterator<String> iter = data.keySet().iterator();
////            while(iter.hasNext()) {
////                String key=iter.next();
////                String value = data.get(key).toString();
////                CellRange[] ranges = worksheet.findAllString("{"+key+"}", true, true);
////                for (CellRange range : ranges)
////                {
////                    range.setText(value);
////                }
////            }
//            LOG.info("LastRow:" +worksheet.getLastRow() +" LastColumn:" +worksheet.getLastColumn());
//            for (int i = 1; i <=worksheet.getLastRow(); i++) {
//                for (int j = 1; j <= worksheet.getLastColumn(); j++) {
//                    CellRange cellRange = worksheet.getRange().get(i, j);
//                    String text = cellRange.getText();
//                    boolean found = false;
//                    List<String> keys = getKeys(text);
//                    if (keys != null && keys.size() != 0) {
//                        for (String key : keys) {
//                            String[] keyArray = key.split("\\.");
//                            if (keyArray.length == 1) {
//                                if (data.containsKey(key)) {
//                                    if (data.get(key) != null) {
//                                        text = (text.replace("{" + key + "}", data.get(key).toString()));
//                                        found = true;
//                                    }
//                                }
//                            } else if (keyArray.length == 4) {
//                                String keyFieldName = keyArray[0];
//                                if (data.containsKey(keyFieldName)) {
//                                    String jsonText = (String) data.get(keyFieldName);
//                                    if (jsonText == null) {
//                                        continue;
//                                    }
//                                    JSONArray jsonArray = JSONArray.parseArray(jsonText);
//                                    if (null == jsonArray) {
//                                        continue;
//                                    }
//                                    //List
//                                    if (keyArray[1].equalsIgnoreCase("list")) {
//
//                                        //index
//                                        Integer index = Integer.parseInt(keyArray[2]);
//                                        if (index == null || index >= jsonArray.size()) {
//                                            continue;
//                                        }
//                                        //key
//                                        String filedItemKey = keyArray[3];
//                                        if (StringUtil.isNotEmptyORNull(filedItemKey) &&
//                                                jsonArray.getJSONObject(index).get(filedItemKey) != null) {
//
//                                            text = (text.replace("{" + key + "}", jsonArray.getJSONObject(index).getString(filedItemKey)));
//                                            found = true;
//                                        }
//                                    }
//
//
//                                }
//                            }
//                        }
//                        if (found) {
//                            cellRange.setText(text);
//                        } else {
//                            cellRange.setText(StringUtil.EMPY_STRING);
//                        }
//                    }
//                }
//            }
//            //查看是否存在excel文本框(一般为头像链接)
//            int textBoxes =  worksheet.getTextBoxes().getCount();
//            for(int i = 0;i<textBoxes;i++) {
//                XlsTextBoxShape textBoxShape = (XlsTextBoxShape) worksheet.getTextBoxes().get(i);
//                String text = textBoxShape.getText();
//                List<String> keys = getKeys(text);
//                if (keys != null && keys.size() !=0 ) {
//                    for(String key:keys) {
//                        if (data.containsKey(key)) {
//                            if (data.get(key) != null) {
//                                text = (text.replace("{" + key + "}", data.get(key).toString()));
//                            } else {
//                                text = (text.replace("{" + key + "}", ""));
//                            }
//                        } else {
//                            text = (text.replace("{" + key + "}", ""));
//                        }
//                    }
//                    if(StringUtil.isNotEmptyORNull(text)){
//                        String substr = text.substring(text.indexOf("group"));
//                        String group = substr.split("/")[0];
//                        String remoteFileName = substr.substring(substr.indexOf("/") + 1);
//                        try {
//                            StorageClient storageClient = fastDFSManager.getClient();
//                            byte[] content = storageClient.download_file(group, remoteFileName);
//                            LOG.info("group:"+group+",remoteFileName:"+remoteFileName);
//                            if(content !=null) {
//                                InputStream imgin = new ByteArrayInputStream(content);
//                                BufferedImage bImageFromConvert = ImageIO.read(imgin);
//                                textBoxShape.getFill().customPicture(bImageFromConvert, remoteFileName);
//                                textBoxShape.setText("");
//                                imgin.close();
//                            }else{
//                                LOG.info("图片不存在");
//                                throw new ServiceException(TipsCode.UNKNOWN_ERROR,"图片不存在");
//                            }
//                        } catch (Exception e) {
//                            LOG.info("excel添加图片失败...");
//                            e.printStackTrace();
//                            throw new ServiceException(TipsCode.UNKNOWN_ERROR,"添加图片失败...");
//
//                        }
//
//                    }
//
//                }
//
//
//            }
//
//            if (wb != null) {
//                try {
//                    String userAgent = request.getHeader("user-agent");
//                    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 定义文件名格式
//                    // pdf 表文件名
//                    String fileName = path  + "_" + format.format(new Date()) + ".xlsx";
//                    String fileName11 = "";
//                    if (userAgent != null && userAgent.indexOf("Firefox") >= 0 || userAgent.indexOf("Chrome") >= 0
//                            || userAgent.indexOf("Safari") >= 0) {
//                        fileName11 = new String((fileName).getBytes(), "ISO-8859-1");
//                    } else {
//                        fileName11 = URLEncoder.encode(fileName, "UTF8"); // 其他浏览器,防止IE乱码
//                    }
//                    String headStr = "attachment; filename=\"" + fileName11 + "\"";
//                    response.setContentType("APPLICATION/OCTET-STREAM");
//                    response.setHeader("Content-Disposition", headStr);
//                    OutputStream out = response.getOutputStream();
//                    //保存临时文件
//                    wb.saveToStream(out, FileFormat.Version2007);
//                    out.flush();
//                    out.close();
//                    is.close();
//                }catch (NullPointerException e) {
//                    throw new ServiceException(TipsCode.UPLOAD_ERROR,"excel模板请使用'微软雅黑','宋体'字体");
//                }
//                catch (IOException e) {
//                    LOG.error(e);
//                    throw e;
//                }
//            }
//        } catch (IOException e) {
//            LOG.error(e);
//            throw new ServiceException(TipsCode.UNKNOWN_ERROR,"");
//        } finally {
//            try {
//                if(null != is){
//                    is.close();
//                    is = null;
//                }
//            }
//            catch (IOException e) {
//                LOG.error(e);
//            }
//
//        }
//    }

    //填充数据
//    public void filldataAndExport3() {
//        try {
//            //读取xlsx格式文件
//            com.spire.xls.Workbook wb=new com.spire.xls.Workbook();
//            if (StringUtil.isNotEmptyORNull(spireFontPath)) {
//                wb.setCustomFontFileDirectory(new String[]{spireFontPath});
//            }
//            InputStream is = new FileInputStream(path);
//            wb.loadFromStream(is);
//            Worksheet worksheet =  wb.getWorksheets().get(0);
////            //遍历填充数据中的key值
////            Iterator<String> iter = data.keySet().iterator();
////            while(iter.hasNext()) {
////                String key=iter.next();
////                String value = data.get(key).toString();
////                CellRange[] ranges = worksheet.findAllString("{"+key+"}", true, true);
////                for (CellRange range : ranges)
////                {
////                    range.setText(value);
////                }
////            }
//            LOG.info("LastRow:" +worksheet.getLastRow() );
//            LOG.info("LastColumn:" +worksheet.getLastColumn() );
//            for (int i = 1; i <=worksheet.getLastRow(); i++){
//                for (int j = 1; j <=worksheet.getLastColumn(); j++){
//                    CellRange cellRange =  worksheet.getRange().get(i , j);
//                    String text = cellRange.getText();
//                    List<String> keys = getKeys(text);
//                    if (keys != null && keys.size() !=0 ) {
//                        for(String key:keys) {
//                            if (data.containsKey(key)) {
//                                if (data.get(key) != null) {
//                                    text = (text.replace("{" + key + "}", data.get(key).toString()));
//                                } else {
//                                    text = (text.replace("{" + key + "}", ""));
//                                }
//                            } else {
//                                text = (text.replace("{" + key + "}", ""));
//                            }
//                        }
//                        cellRange.setText(text);
//                    }
//
//                }
//            }
//            //查看是否存在excel文本框(一般为头像链接)
//            int textBoxes =  worksheet.getTextBoxes().getCount();
//            for(int i = 0;i<textBoxes;i++) {
//                XlsTextBoxShape textBoxShape = (XlsTextBoxShape) worksheet.getTextBoxes().get(i);
//                String text = textBoxShape.getText();
//                List<String> keys = getKeys(text);
//                if (keys != null && keys.size() !=0 ) {
//                    for(String key:keys) {
//                        if (data.containsKey(key)) {
//                            if (data.get(key) != null) {
//                                text = (text.replace("{" + key + "}", data.get(key).toString()));
//                            } else {
//                                text = (text.replace("{" + key + "}", ""));
//                            }
//                        } else {
//                            text = (text.replace("{" + key + "}", ""));
//                        }
//                    }
//                    if(StringUtil.isNotEmptyORNull(text)){
//                        String substr = text.substring(text.indexOf("group1"));
//                        String group = substr.split("/")[0];
//                        String remoteFileName = substr.substring(substr.indexOf("/") + 1);
//                        try {
//                            StorageClient storageClient = fastDFSManager.getClient();
//                            byte[] content = storageClient.download_file(group, remoteFileName);
//                            LOG.info("group:"+group+",remoteFileName:"+remoteFileName);
//                            if(content !=null) {
//                                InputStream imgin = new ByteArrayInputStream(content);
//                                BufferedImage bImageFromConvert = ImageIO.read(imgin);
//                                textBoxShape.getFill().customPicture(bImageFromConvert, remoteFileName);
//                                textBoxShape.setText("");
//                                imgin.close();
//                            }else{
//                                LOG.info("图片不存在");
//                                throw new ServiceException(TipsCode.UNKNOWN_ERROR,"图片不存在");
//                            }
//                        } catch (Exception e) {
//                            LOG.info("excel添加图片失败...");
//                            e.printStackTrace();
//                            throw new ServiceException(TipsCode.UNKNOWN_ERROR,"添加图片失败...");
//
//                        }
//
//                    }
//
//                }
//
//
//            }
//
//            if (wb != null) {
//                try {
//                    String userAgent = request.getHeader("user-agent");
//                    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 定义文件名格式
//                    // pdf 表文件名
//                    String fileName = path  + "_" + format.format(new Date()) + ".xlsx";
//                    String fileName11 = "";
//                    if (userAgent != null && userAgent.indexOf("Firefox") >= 0 || userAgent.indexOf("Chrome") >= 0
//                            || userAgent.indexOf("Safari") >= 0) {
//                        fileName11 = new String((fileName).getBytes(), "ISO-8859-1");
//                    } else {
//                        fileName11 = URLEncoder.encode(fileName, "UTF8"); // 其他浏览器,防止IE乱码
//                    }
//                    String headStr = "attachment; filename=\"" + fileName11 + "\"";
//                    response.setContentType("APPLICATION/OCTET-STREAM");
//                    response.setHeader("Content-Disposition", headStr);
//                    OutputStream out = response.getOutputStream();
//                    //保存临时文件
//                    wb.saveToStream(out, FileFormat.Version2007);
//                    out.flush();
//                    out.close();
//                    is.close();
//                }catch (NullPointerException e) {
//                    throw new ServiceException(TipsCode.UPLOAD_ERROR,"excel模板请使用'微软雅黑','宋体'字体");
//                }
//                catch (IOException e) {
//                    LOG.error(e);
//                    throw e;
//                }
//            }
//        } catch (IOException e) {
//            LOG.error(e);
//            throw new ServiceException(TipsCode.UNKNOWN_ERROR,"");
//        } finally {
//
//
//        }
//    }


//    public com.spire.xls.Workbook filldataAndExport4() {
//        InputStream is = null;
//        try {
//            //读取xlsx格式文件
//            com.spire.xls.Workbook wb=new com.spire.xls.Workbook();
//            XSSFWorkbook sheets = new XSSFWorkbook();
//            is = new FileInputStream(path);
//            wb.loadFromStream(is);
//            Worksheet worksheet =  wb.getWorksheets().get(0);
////            //遍历填充数据中的key值
////            Iterator<String> iter = data.keySet().iterator();
////            while(iter.hasNext()) {
////                String key=iter.next();
////                String value = data.get(key).toString();
////                CellRange[] ranges = worksheet.findAllString("{"+key+"}", true, true);
////                for (CellRange range : ranges)
////                {
////                    range.setText(value);
////                }
////            }
//            LOG.info("LastRow:" +worksheet.getLastRow() +" LastColumn:" +worksheet.getLastColumn());
//            for (int i = 1; i <=worksheet.getLastRow(); i++) {
//                for (int j = 1; j <= worksheet.getLastColumn(); j++) {
//                    CellRange cellRange = worksheet.getRange().get(i, j);
//                    String text = cellRange.getText();
//                    boolean found = false;
//                    List<String> keys = getKeys(text);
//                    if (keys != null && keys.size() != 0) {
//                        for (String key : keys) {
//                            String[] keyArray = key.split("\\.");
//                            if (keyArray.length == 1) {
//                                if (data.containsKey(key)) {
//                                    if (data.get(key) != null) {
//                                        if ("照片".equals(key)){
//                                            worksheet.getPictures().add(cellRange.getRow(), cellRange.getColumn(),(InputStream) data.get(key));
//                                        }else {
//                                            text = (text.replace("{" + key + "}", data.get(key).toString()));
//                                            found = true;
//                                        }
////                                        text = (text.replace("{" + key + "}", data.get(key).toString()));
////                                        found = true;
//                                    }
//                                }
//                            } else if (keyArray.length == 4) {
//                                String keyFieldName = keyArray[0];
//                                if (data.containsKey(keyFieldName)) {
//                                    String jsonText = (String) data.get(keyFieldName);
//                                    if (jsonText == null) {
//                                        continue;
//                                    }
//                                    JSONArray jsonArray = JSONArray.parseArray(jsonText);
//                                    if (null == jsonArray) {
//                                        continue;
//                                    }
//                                    //List
//                                    if (keyArray[1].equalsIgnoreCase("list")) {
//
//                                        //index
//                                        Integer index = Integer.parseInt(keyArray[2]);
//                                        if (index == null || index >= jsonArray.size()) {
//                                            continue;
//                                        }
//                                        //key
//                                        String filedItemKey = keyArray[3];
//                                        if (StringUtil.isNotEmptyORNull(filedItemKey) &&
//                                                jsonArray.getJSONObject(index).get(filedItemKey) != null) {
//
//                                            text = (text.replace("{" + key + "}", jsonArray.getJSONObject(index).getString(filedItemKey)));
//                                            found = true;
//                                        }
//                                    }
//
//
//                                }
//                            }
//                        }
//                        if (found) {
//                            cellRange.setText(text);
//                        } else {
//                            cellRange.setText(StringUtil.EMPY_STRING);
//                        }
//                    }
//                }
//            }
//            //查看是否存在excel文本框(一般为头像链接)
//            int textBoxes =  worksheet.getTextBoxes().getCount();
//            for(int i = 0;i<textBoxes;i++) {
//                XlsTextBoxShape textBoxShape = (XlsTextBoxShape) worksheet.getTextBoxes().get(i);
//                String text = textBoxShape.getText();
//                List<String> keys = getKeys(text);
//                if (keys != null && keys.size() !=0 ) {
//                    for(String key:keys) {
//                        if (data.containsKey(key)) {
//                            if (data.get(key) != null) {
//                                text = (text.replace("{" + key + "}", data.get(key).toString()));
//                            } else {
//                                text = (text.replace("{" + key + "}", ""));
//                            }
//                        } else {
//                            text = (text.replace("{" + key + "}", ""));
//                        }
//                    }
//                    if(StringUtil.isNotEmptyORNull(text)){
//                        String substr = text.substring(text.indexOf("group"));
//                        String group = substr.split("/")[0];
//                        String remoteFileName = substr.substring(substr.indexOf("/") + 1);
//                        try {
//                            StorageClient storageClient = fastDFSManager.getClient();
//                            byte[] content = storageClient.download_file(group, remoteFileName);
//                            LOG.info("group:"+group+",remoteFileName:"+remoteFileName);
//                            if(content !=null) {
//                                InputStream imgin = new ByteArrayInputStream(content);
//                                BufferedImage bImageFromConvert = ImageIO.read(imgin);
//                                textBoxShape.getFill().customPicture(bImageFromConvert, remoteFileName);
//                                textBoxShape.setText("");
//                                imgin.close();
//                            }else{
//                                LOG.info("图片不存在");
//                                throw new ServiceException(TipsCode.UNKNOWN_ERROR,"图片不存在");
//                            }
//                        } catch (Exception e) {
//                            LOG.info("excel添加图片失败...");
//                            e.printStackTrace();
//                            throw new ServiceException(TipsCode.UNKNOWN_ERROR,"添加图片失败...");
//
//                        }
//
//                    }
//
//                }
//
//
//            }
//
//            if (wb != null) {
//                try {
//                    return wb;
//                }catch (NullPointerException e) {
//                    throw new ServiceException(TipsCode.UPLOAD_ERROR,"excel模板请使用'微软雅黑','宋体'字体");
//                }
//            }
//        } catch (IOException e) {
//            LOG.error(e);
//            throw new ServiceException(TipsCode.UNKNOWN_ERROR,"");
//        } finally {
//            try {
//                if(null != is){
//                    is.close();
//                    is = null;
//                }
//            }
//            catch (IOException e) {
//                LOG.error(e);
//            }
//
//        }
//       return null;
//    }


    //填充数据
    public void filldataAndExportPdf() {
        try {
            //读取xlsx格式文件
            Workbook wb=new XSSFWorkbook(new FileInputStream(path));
            Sheet sheet = wb.getSheetAt(0);
            for(int i = 0; i <= sheet.getLastRowNum(); i++){
                Row row = sheet.getRow(i);
                if(row !=null) {
                    for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
                        Cell cell = row.getCell(j);
                        if (cell.getCellType() == CellType.STRING) {
                            String cellValue = cell.getStringCellValue();
                            String key = getKey(cellValue);
                            if (key != null) {
                                if (data.containsKey(key)) {
                                    if (data.get(key) != null) {
                                        cell.setCellValue(data.get(key).toString());
                                    } else {
                                        cell.setCellValue("");
                                    }
                                } else {
                                    cell.setCellValue("");
                                }
                            }
                        }
                    }
                }
            }
            //导出excel
            if (wb != null) {
                try {
                    String userAgent = request.getHeader("user-agent");
                    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 定义文件名格式
                    // excel 表文件名
                    String fileName = path  + "_" + format.format(new Date()) + ".pdf";
                    String fileName11 = "";
                    if (userAgent != null && userAgent.indexOf("Firefox") >= 0 || userAgent.indexOf("Chrome") >= 0
                            || userAgent.indexOf("Safari") >= 0) {
                        fileName11 = new String((fileName).getBytes(), "ISO-8859-1");
                    } else {
                        fileName11 = URLEncoder.encode(fileName, "UTF8"); // 其他浏览器,防止IE乱码
                    }
                    String headStr = "attachment; filename=\"" + fileName11 + "\"";
                    response.setContentType("APPLICATION/PDF");
                    response.setHeader("Content-Disposition", headStr);
                    OutputStream out = response.getOutputStream();

                    InputStream finalIs  = wbToInputStream(wb);
                    com.spire.xls.Workbook wbconvert= new com.spire.xls.Workbook();
                    if (StringUtil.isNotEmptyORNull(spireFontPath)) {
                        wbconvert.setCustomFontFileDirectory(new String[]{spireFontPath});
                    }
                    wbconvert.loadFromStream(finalIs);
                    wbconvert.saveToStream(out, FileFormat.PDF);
//
                    out.flush();
                    out.close();

                } catch (IOException e) {
                    LOG.error(e);
                }
            }
        } catch (IOException e) {
            LOG.error(e);
        }
    }


//    public void filldataAndExportPdf2() {
//        InputStream is  = null;
//        try {
//            //读取xlsx格式文件
//            com.spire.xls.Workbook wb=new com.spire.xls.Workbook();
//            if (StringUtil.isNotEmptyORNull(spireFontPath)) {
//                wb.setCustomFontFileDirectory(new String[]{spireFontPath});
//            }
//            is = new FileInputStream(path);
//            wb.loadFromStream(is);
//            Worksheet worksheet =  wb.getWorksheets().get(0);
////            //遍历填充数据中的key值
////            Iterator<String> iter = data.keySet().iterator();
////            while(iter.hasNext()) {
////                String key=iter.next();
////                String value = data.get(key).toString();
////                CellRange[] ranges = worksheet.findAllString("{"+key+"}", true, true);
////                for (CellRange range : ranges)
////                {
////                    range.setText(value);
////                }
////            }
//            LOG.info("LastRow:" +worksheet.getLastRow() +" LastColumn:" +worksheet.getLastColumn());
//            for (int i = 1; i <=worksheet.getLastRow(); i++) {
//                for (int j = 1; j <= worksheet.getLastColumn(); j++) {
//                    CellRange cellRange = worksheet.getRange().get(i, j);
//                    String text = cellRange.getText();
//                    boolean found = false;
//                    List<String> keys = getKeys(text);
//                    if (keys != null && keys.size() != 0) {
//                        for (String key : keys) {
//                            String[] keyArray = key.split("\\.");
//                            if (keyArray.length == 1 || keyArray.length == 2) {
//                                if (data.containsKey(key)) {
//                                    if (data.get(key) != null) {
//                                        if ("照片".equals(key)){
//                                            worksheet.getPictures().add(cellRange.getRow(), cellRange.getColumn(),(InputStream)data.get(key));
//                                        }else {
//                                            text = (text.replace("{" + key + "}", data.get(key).toString()));
//                                            found = true;
//                                        }
//                                    }
//                                }
//                                else {
//                                    text = (text.replace("{" + key + "}", StringUtil.EMPY_STRING));
//                                    found = true;
//                                }
//                            } else if (keyArray.length == 4) {
//                                String keyFieldName = keyArray[0];
//                                if (data.containsKey(keyFieldName)) {
//                                    String jsonText = (String) data.get(keyFieldName);
//                                    if (jsonText == null) {
//                                        continue;
//                                    }
//                                    JSONArray jsonArray = JSONArray.parseArray(jsonText);
//                                    if (null == jsonArray) {
//                                        continue;
//                                    }
//                                    //List
//                                    if (keyArray[1].equalsIgnoreCase("list")) {
//
//                                        //index
//                                        Integer index = Integer.parseInt(keyArray[2]);
//                                        if (index == null || index >= jsonArray.size()) {
//                                            continue;
//                                        }
//                                        //key
//                                        String filedItemKey = keyArray[3];
//                                        if (StringUtil.isNotEmptyORNull(filedItemKey) &&
//                                                jsonArray.getJSONObject(index).get(filedItemKey) != null) {
//
//                                            text = (text.replace("{" + key + "}", jsonArray.getJSONObject(index).getString(filedItemKey)));
//                                            found = true;
//                                        }
//                                    }
//
//
//                                }
//                            }
//                        }
//                        if (found) {
//                            if (worksheet.getRowIsHide(i) && StringUtil.isNotEmptyORNull(text)) {
//                                worksheet.showRow(i);
//                            }
//                            cellRange.setText(text);
//                        } else {
//                            cellRange.setText(StringUtil.EMPY_STRING);
//                        }
//                    }
//                }
//            }
//            //查看是否存在excel文本框(一般为头像链接)
//            int textBoxes =  worksheet.getTextBoxes().getCount();
//            LOG.info("textBoxes:"+textBoxes);
//            for(int i = 0;i<textBoxes;i++) {
//                XlsTextBoxShape textBoxShape = (XlsTextBoxShape) worksheet.getTextBoxes().get(i);
//                String text = textBoxShape.getText();
//                List<String> keys = getKeys(text);
//                if (keys != null && keys.size() !=0 ) {
//                    for(String key:keys) {
//                            if (data.containsKey(key)) {
//                                if (data.get(key) != null) {
//                                    text = (text.replace("{" + key + "}", data.get(key).toString()));
//                                } else {
//                                    text = (text.replace("{" + key + "}", StringUtil.EMPY_STRING));
//                                }
//                            } else {
//                                text = (text.replace("{" + key + "}", StringUtil.EMPY_STRING));
//                            }
//                        }
//
//                    }
//                    if(StringUtil.isNotEmptyORNull(text)){
//                        String substr = text.substring(text.indexOf("group"));
//                        String group = substr.split("/")[0];
//                        String remoteFileName = substr.substring(substr.indexOf("/") + 1);
//                        try {
//                            StorageClient storageClient = fastDFSManager.getClient();
//                            byte[] content = storageClient.download_file(group, remoteFileName);
//                            LOG.info("group:"+group+",remoteFileName:"+remoteFileName);
//                            if(content !=null) {
//                                InputStream imgin = new ByteArrayInputStream(content);
//                                BufferedImage bImageFromConvert = ImageIO.read(imgin);
//                                textBoxShape.getFill().customPicture(bImageFromConvert, remoteFileName);
//                                textBoxShape.setText("");
//                                imgin.close();
//                            }else{
//                                LOG.info("图片不存在");
//                            }
//                        } catch (Exception e) {
//                            LOG.info("excel添加图片失败...");
//                            LOG.error(e);
//
//                        }
//
//                    }
//
//                }
//
//            if (wb != null) {
//                OutputStream out = null;
//                try {
//                    String userAgent = request.getHeader("user-agent");
//                    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 定义文件名格式
//                    // pdf 表文件名
//                    String fileName = path  + "_" + format.format(new Date()) + ".xlsx";
//                    String fileName11 = "";
//                    if (userAgent != null && userAgent.indexOf("Firefox") >= 0 || userAgent.indexOf("Chrome") >= 0
//                            || userAgent.indexOf("Safari") >= 0) {
//                        fileName11 = new String((fileName).getBytes(), "ISO-8859-1");
//                    } else {
//                        fileName11 = URLEncoder.encode(fileName, "UTF8"); // 其他浏览器,防止IE乱码
//                    }
//                    String headStr = "attachment; filename=\"" + fileName11 + "\"";
//                    response.setContentType("APPLICATION/PDF");
//                    response.setHeader("Content-Disposition", headStr);
//                    out = response.getOutputStream();
//                    //保存临时文件
//                    //wb.saveToFile(fileName,FileFormat.Version2007);
//                    wb.saveToStream(out, FileFormat.PDF);
//                    out.flush();
//                    out.close();
//                }
//                catch (IOException e) {
//                    LOG.error(e);
//                }finally {
//                    if(null != out){
//                        out.close();
//                    }
//                    if(null != is){
//                        is.close();
//                        is = null;
//                    }
//                }
//            }
//        } catch (IOException e) {
//            LOG.error(e);
//        } finally {
//            try {
//                if(null != is){
//                    is.close();
//                    is = null;
//                }
//            }
//            catch (IOException e) {
//                LOG.error(e);
//            }
//
//        }
//    }


    //public void filldataAndExportPdf3() {
    //    try {
    //        long s1= System.currentTimeMillis();
    //        //读取xlsx格式文件
    //        com.spire.xls.Workbook wb=new com.spire.xls.Workbook();
    //        if (StringUtil.isNotEmptyORNull(spireFontPath)) {
    //            wb.setCustomFontFileDirectory(new String[]{spireFontPath});
    //        }
    //
    //        InputStream is = new FileInputStream(path);
    //        wb.loadFromStream(is);
    //        Worksheet worksheet =  wb.getWorksheets().get(0);
    //        CellRange[] ranges = worksheet.findAllString("{", true, true);
    //        for (CellRange range : ranges)
    //        {
    //            String text = range.getText();
    //            List<String> keys = getKeys(text);
    //            if (keys != null && keys.size() !=0 ) {
    //                for(String key:keys) {
    //                    if (data.containsKey(key)) {
    //                        if (data.get(key) != null) {
    //                            text = (text.replace("{" + key + "}", data.get(key).toString()));
    //                        } else {
    //                            text = (text.replace("{" + key + "}", ""));
    //                        }
    //                    } else {
    //                        text = (text.replace("{" + key + "}", ""));
    //                    }
    //                }
    //                range.setText(text);
    //            }
    //        }
    //        long s2= System.currentTimeMillis();
    //        LOG.info("2:"+(s2-s1));
    //
    //
    //        if (wb != null) {
    //            try {
    //                String userAgent = request.getHeader("user-agent");
    //                SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 定义文件名格式
    //                // pdf 表文件名
    //                String fileName = path  + "_" + format.format(new Date()) + ".xlsx";
    //                String fileName11 = "";
    //                if (userAgent != null && userAgent.indexOf("Firefox") >= 0 || userAgent.indexOf("Chrome") >= 0
    //                        || userAgent.indexOf("Safari") >= 0) {
    //                    fileName11 = new String((fileName).getBytes(), "ISO-8859-1");
    //                } else {
    //                    fileName11 = URLEncoder.encode(fileName, "UTF8"); // 其他浏览器,防止IE乱码
    //                }
    //                String headStr = "attachment; filename=\"" + fileName11 + "\"";
    //                response.setContentType("APPLICATION/PDF");
    //                response.setHeader("Content-Disposition", headStr);
    //                OutputStream out = response.getOutputStream();
    //                //保存临时文件
    //                wb.saveToFile(fileName,FileFormat.Version2007);
    //                wb.saveToStream(out, FileFormat.PDF);
    //                out.flush();
    //                out.close();
    //                is.close();
    //            }catch (NullPointerException e) {
    //                throw new ServiceException(TipsCode.UPLOAD_ERROR,"excel模板请使用'微软雅黑','宋体'字体");
    //            }
    //            catch (IOException e) {
    //                LOG.error(e);
    //            }
    //        }
    //    } catch (IOException e) {
    //        LOG.error(e);
    //    } finally {
    //
    //
    //    }
    //}



    //public String filldataAndSavePdf(String tempPath) {
    //    String fileNamePDF = StringUtil.EMPY_STRING;
    //    try {
    //        //读取xlsx格式文件
    //        com.spire.xls.Workbook wb=new com.spire.xls.Workbook();
    //        if (StringUtil.isNotEmptyORNull(spireFontPath)) {
    //            wb.setCustomFontFileDirectory(new String[]{spireFontPath});
    //        }
    //        InputStream is = new FileInputStream(path);
    //        wb.loadFromStream(is);
    //        Worksheet worksheet =  wb.getWorksheets().get(0);
    //        LOG.info("LastRow:" +worksheet.getLastRow() );
    //        LOG.info("LastColumn:" +worksheet.getLastColumn() );
    //        for (int i = 1; i <=worksheet.getLastRow(); i++){
    //            for (int j = 1; j <=worksheet.getLastColumn(); j++){
    //                CellRange cellRange =  worksheet.getRange().get(i , j);
    //                String text = cellRange.getText();
    //                List<String> keys = getKeys(text);
    //                if (keys != null && keys.size() !=0 ) {
    //                    for(String key:keys) {
    //                        if (data.containsKey(key)) {
    //                            if (data.get(key) != null) {
    //                                text = (text.replace("{" + key + "}", data.get(key).toString()));
    //                            } else {
    //                                text = (text.replace("{" + key + "}", ""));
    //                            }
    //                        } else {
    //                            text = (text.replace("{" + key + "}", ""));
    //                        }
    //                    }
    //                    cellRange.setText(text);
    //                }
    //
    //            }
    //        }
    //        //查看是否存在excel文本框(一般为头像链接)
    //        int textBoxes =  worksheet.getTextBoxes().getCount();
    //        LOG.info("textBoxes:"+textBoxes);
    //        for(int i = 0;i<textBoxes;i++) {
    //            XlsTextBoxShape textBoxShape = (XlsTextBoxShape) worksheet.getTextBoxes().get(i);
    //            String text = textBoxShape.getText();
    //            List<String> keys = getKeys(text);
    //            if (keys != null && keys.size() !=0 ) {
    //                for(String key:keys) {
    //                    if (data.containsKey(key)) {
    //                        if (data.get(key) != null) {
    //                            text = (text.replace("{" + key + "}", data.get(key).toString()));
    //                        } else {
    //                            text = (text.replace("{" + key + "}", ""));
    //                        }
    //                    } else {
    //                        text = (text.replace("{" + key + "}", ""));
    //                    }
    //                }
    //                if(StringUtil.isNotEmptyORNull(text)){
    //                    String substr = text.substring(text.indexOf("group"));
    //                    String group = substr.split("/")[0];
    //                    String remoteFileName = substr.substring(substr.indexOf("/") + 1);
    //                    try {
    //                        StorageClient storageClient = fastDFSManager.getClient();
    //                        byte[] content = storageClient.download_file(group, remoteFileName);
    //                        LOG.info("group:"+group+",remoteFileName:"+remoteFileName);
    //                        if(content !=null) {
    //                            InputStream imgin = new ByteArrayInputStream(content);
    //                            BufferedImage bImageFromConvert = ImageIO.read(imgin);
    //                            textBoxShape.getFill().customPicture(bImageFromConvert, remoteFileName);
    //                            textBoxShape.setText("");
    //                            imgin.close();
    //                        }else{
    //                            LOG.info("图片不存在");
    //                        }
    //                    } catch (Exception e) {
    //                        LOG.info("excel添加图片失败...");
    //                        e.printStackTrace();
    //
    //                    }
    //
    //                }
    //
    //            }
    //
    //
    //        }
    //        if (wb != null) {
    //            OutputStream out = null;
    //            try {
    //
    //                // pdf 表文件名
    //                fileNamePDF = tempPath + IdGeneratorUtil.createPk("BD") + ".pdf";
    //                wb.saveToFile(fileNamePDF, FileFormat.PDF);
    //                is.close();
    //
    //            }
    //            catch (IOException e) {
    //                LOG.error(e);
    //            }finally {
    //                if(null != out){
    //                    out.close();
    //                }
    //                if(null != is){
    //                    is.close();
    //                }
    //            }
    //        }
    //    } catch (IOException e) {
    //        LOG.error(e);
    //    } finally {
    //
    //    }
    //    return fileNamePDF;
    //}

    //public Map<String,Object> filldataAndSavePdf2(String tempPath) {
    //    String fileNamePDF = StringUtil.EMPY_STRING;
    //    byte[] fileByte = null;
    //    String filename = "";
    //    try {
    //        //读取xlsx格式文件
    //        com.spire.xls.Workbook wb=new com.spire.xls.Workbook();
    //        if (StringUtil.isNotEmptyORNull(spireFontPath)) {
    //            wb.setCustomFontFileDirectory(new String[]{spireFontPath});
    //        }
    //        InputStream is = new FileInputStream(path);
    //        wb.loadFromStream(is);
    //        Worksheet worksheet =  wb.getWorksheets().get(0);
    //        LOG.info("LastRow:" +worksheet.getLastRow() );
    //        LOG.info("LastColumn:" +worksheet.getLastColumn() );
    //        for (int i = 1; i <=worksheet.getLastRow(); i++){
    //            for (int j = 1; j <=worksheet.getLastColumn(); j++){
    //                CellRange cellRange =  worksheet.getRange().get(i , j);
    //                String text = cellRange.getText();
    //                List<String> keys = getKeys(text);
    //                if (keys != null && keys.size() !=0 ) {
    //                    for(String key:keys) {
    //                        if (data.containsKey(key)) {
    //                            if (data.get(key) != null) {
    //                                text = (text.replace("{" + key + "}", data.get(key).toString()));
    //                            } else {
    //                                text = (text.replace("{" + key + "}", ""));
    //                            }
    //                        } else {
    //                            text = (text.replace("{" + key + "}", ""));
    //                        }
    //                    }
    //                    cellRange.setText(text);
    //                }
    //
    //            }
    //        }
    //        //查看是否存在excel文本框(一般为头像链接)
    //        int textBoxes =  worksheet.getTextBoxes().getCount();
    //        LOG.info("textBoxes:"+textBoxes);
    //        for(int i = 0;i<textBoxes;i++) {
    //            XlsTextBoxShape textBoxShape = (XlsTextBoxShape) worksheet.getTextBoxes().get(i);
    //            String text = textBoxShape.getText();
    //            List<String> keys = getKeys(text);
    //            if (keys != null && keys.size() !=0 ) {
    //                for(String key:keys) {
    //                    if (data.containsKey(key)) {
    //                        if (data.get(key) != null) {
    //                            text = (text.replace("{" + key + "}", data.get(key).toString()));
    //                        } else {
    //                            text = (text.replace("{" + key + "}", ""));
    //                        }
    //                    } else {
    //                        text = (text.replace("{" + key + "}", ""));
    //                    }
    //                }
    //                if(StringUtil.isNotEmptyORNull(text)){
    //                    String substr = text.substring(text.indexOf("group"));
    //                    String group = substr.split("/")[0];
    //                    String remoteFileName = substr.substring(substr.indexOf("/") + 1);
    //                    try {
    //                        StorageClient storageClient = fastDFSManager.getClient();
    //                        byte[] content = storageClient.download_file(group, remoteFileName);
    //                        LOG.info("group:"+group+",remoteFileName:"+remoteFileName);
    //                        if(content !=null) {
    //                            InputStream imgin = new ByteArrayInputStream(content);
    //                            BufferedImage bImageFromConvert = ImageIO.read(imgin);
    //                            textBoxShape.getFill().customPicture(bImageFromConvert, remoteFileName);
    //                            textBoxShape.setText("");
    //                            imgin.close();
    //                        }else{
    //                            LOG.info("图片不存在");
    //                        }
    //                    } catch (Exception e) {
    //                        LOG.info("excel添加图片失败...");
    //                        e.printStackTrace();
    //
    //                    }
    //
    //                }
    //
    //            }
    //
    //
    //        }
    //        if (wb != null) {
    //            OutputStream out = null;
    //            try {
    //                // pdf 表文件名
    //                fileNamePDF = tempPath +"/"+IdGeneratorUtil.createPk("BD") + ".pdf";
    //                filename = fileNamePDF;
    //                wb.saveToFile(fileNamePDF, FileFormat.PDF);
    //                //String destFilePath = tempPath + File.separator  + fileNamePDF;
    //                fileByte = FileUtil.readFile(fileNamePDF);
    //
    //                is.close();
    //
    //            }
    //            catch (IOException e) {
    //                LOG.error(e);
    //            }finally {
    //                if(null != out){
    //                    out.close();
    //                }
    //                if(null != is){
    //                    is.close();
    //                }
    //            }
    //        }
    //    } catch (IOException e) {
    //        LOG.error(e);
    //    } finally {
    //
    //    }
    //    Map<String,Object> map = new HashMap<>();
    //    map.put("byte",fileByte);
    //    map.put("filename",filename);
    //    return map;
    //}

    private InputStream wbToInputStream(Workbook workbook){
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            workbook.write(bos);
            byte[] barray = bos.toByteArray();
            InputStream is = new ByteArrayInputStream(barray);
            return is;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    public Workbook filldata(Map<String,Object> data) {
        Workbook wb= null;
        try {
            //XSSFWorkbook  说明是07版本的excel
            wb = new XSSFWorkbook(new FileInputStream(path));
            Sheet sheet = wb.getSheetAt(0);
            for(int i = 0; i <= sheet.getLastRowNum(); i++) {
                Row row = sheet.getRow(i);
                if(row !=null) {
                    for (int j = 0; j < sheet.getLastRowNum(); j++) {
                        Cell cell = row.getCell(j);
                        if (null == cell)
                            continue;
                        if (cell.getCellTypeEnum() != CellType.STRING)
                            continue;
                        String cellValue = cell.getStringCellValue();
                        String key = getKey(cellValue);
                        if (key != null) {
                            if (data.containsKey(key)) {
                                cell.setCellValue(data.get(key).toString());
                            } else {
                                cell.setCellValue("");
                            }
                        }
                    }
                }
            }

            return wb;
        } catch (IOException e) {
            LOG.error(e);
        }
        return null;
    }

    //获取excel中的数据  例如 {psnname}, 返回psnname
    public String getKey(String cellValue) {
        String reg = "\\{.*\\}";
        Pattern pattern = Pattern.compile(reg);
        Matcher m = pattern.matcher(cellValue);
        if (m.find()) {
            String key = m.group(0);
            key = key.substring(1,key.length()-1);
            return key;
        }
        return null;
    }
    //获取excel中的数据  例如 {psnname}{abc}, 返回 psnname,abc 集合
    public List<String> getKeys(String cellValue) {
        List<String> keys = new ArrayList<>();
        String reg = "\\{[^\\}]+\\}";
        Pattern pattern = Pattern.compile(reg);
        Matcher m = pattern.matcher(cellValue);
        while (m.find()) {
            String key = m.group(0);
            key = key.substring(1,key.length()-1);
            keys.add(key);
        }
        return keys;
    }

    String reg = "\\{[^\\}]+\\}";


    public static void main(String[] args) throws IOException {
        Map<String, Object> map = new HashMap<>();
        map.put("申请人名称", "aaa");





//        new ExcelReportUtil("干部任免审批表（excel格式）.xlsx", map).filldata();

//        Workbook wb=new XSSFWorkbook(new FileInputStream("D:\\program\\hcow-service-pg\\excel_template\\干部任免审批表（excel格式）.xlsx"));
//        Sheet sheet = wb.getSheetAt(1);
//        Row row = sheet.getRow(0);
//        Cell cell = row.getCell(0);
//        cell.setCellValue("nihao");

//        String reg = "#\\w+#";
//        Pattern pattern = Pattern.compile(reg);
//        Matcher m = pattern.matcher("天：psnname#123");
//        System.out.println(m.find());
//        System.out.println(m.group(0));
//        if (m.groupCount() > 0) {
//            String key = m.group(1);
//            key = key.substring(1,key.length()-1);
//            System.out.println(key);
//        }

    }
}
